package com.yunxi.module.infra.service.file.impl;

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.yunxi.framework.common.util.io.FileUtils;
import com.yunxi.module.infra.framework.file.core.client.FileClient;
import com.yunxi.module.infra.framework.file.core.utils.FileTypeUtils;
import com.yunxi.module.infra.mapper.file.FileMapper;
import com.yunxi.module.infra.model.file.FileDO;
import com.yunxi.module.infra.service.file.FileConfigService;
import com.yunxi.module.infra.service.file.FileService;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * <p>
 * 文件 Service 接口实现类
 * </p>
 *
 * @author lidy
 * @since 2024-05-18
 */
@Service
public class FileServiceImpl implements FileService {

    @Resource
    private FileConfigService fileConfigService;

    @Resource
    private FileMapper fileMapper;

    /**
     * 保存文件，返回文件的访问路径
     *
     * @param name    文件名称
     * @param path    文件路径
     * @param content 文件内容
     * @return 文件访问路径
     */
    @Override
    @SneakyThrows
    public String createFile(String name, String path, byte[] content) {
        // 计算默认的 path 名
        String type = FileTypeUtils.getMineType(content, name);
        if (StrUtil.isEmpty(path)) {
            path = FileUtils.generatePath(content, name);
        }

        // 如果 name 为空，则使用 path 填充
        if (StrUtil.isEmpty(name)) {
            name = path;
        }

        // 上传到文件存储器
        // 获得文件服务器配置
        FileClient client = fileConfigService.getMasterFileClient();
        // 断言
        Assert.notNull(client, "客户端（master）不能为空");
        String url = client.upload(content, path, type);

        // 保存到数据库
        FileDO fileDO = new FileDO();
        fileDO.setConfigId(client.getId());
        fileDO.setName(name);
        fileDO.setPath(path);
        fileDO.setUrl(url);
        fileDO.setType(type);
        fileDO.setSize(content.length);
        fileMapper.insert(fileDO);

        return url;
    }
}
